package cn.tedu.spotms.server.service.impl;

import cn.tedu.spotms.server.ex.ServiceException;
import cn.tedu.spotms.server.mapper.ProjectMapper;
import cn.tedu.spotms.server.pojo.dto.ProjectAddNewDTO;
import cn.tedu.spotms.server.pojo.dto.ProjectUpdateInfoDTO;
import cn.tedu.spotms.server.pojo.entity.Project;
import cn.tedu.spotms.server.pojo.vo.ProjectSimpleVO;
import cn.tedu.spotms.server.service.IProjectService;
import cn.tedu.spotms.server.web.State;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 游乐项目业务逻辑层实现类
 */
@Service
@Slf4j
public class ProjectServiceImpl implements IProjectService {
    @Autowired
    private ProjectMapper mapper;

    @Override
    public void addNewProject(ProjectAddNewDTO projectAddNewDTO) {
        log.trace("业务逻辑层：ProjectServiceImpl.addNewProject() >>> 开始添加游乐项目");
        log.debug("尝试添加的游乐项目信息：" +projectAddNewDTO);
        //判断数据库中是否已有此游乐项目名
        log.trace("根据参数获取项目的名字...");
        String name = projectAddNewDTO.getName();
        //是:将抛出异常
        if(mapper.getProjectByName(name) != null){
            log.debug("项目名:{},已存在,不可重复,将抛出异常",name);
            throw new ServiceException(State.ERR_PROJECT_NAME_DUPLICATE,"添加失败,项目名字不可重复!");
        }
        //否:游乐项目名字不重复
        // 创建Merchant对象
        Project project = new Project();
        // 调用BeanUtils.copyProperties()将参数对象中的属性值复制到Project对象中,并补全相应数据
        BeanUtils.copyProperties(projectAddNewDTO,project);
        //补全其他属性:
        project.setViewCount(0);
        LocalDateTime now = LocalDateTime.now();
        project.setGmtCreate(now);
        project.setGmtCreate(now);
        //插入数据
        int rows = mapper.insert(project);
        if(rows != 1){
            log.trace("添加数据失败,将抛出异常");
            throw new ServiceException(State.ERR_UPDATE,"添加数据失败,服务器忙,请稍后尝试!");
        }
    }

    @Override
    public void deleteProjectById(Long id) {
        log.trace("开始删除...");
        //通过id查询项目数据是否存在
        ProjectSimpleVO project = mapper.getProjectById(id);
        log.debug("通过id查询到项目数据:{}",project);
        //否:将抛出异常
        if(project == null){
            log.trace("删除失败,数据不存在,将抛出异常");
            throw new ServiceException(State.ERR_PROJECT_NOT_FOUND,"删除失败,该项目不存在!");
        }
        //是:删除该项目
        mapper.deleteProjectById(id);
        log.debug("根据id{},删除该项目成功!",id);
    }

    @Override
    public void updateProjectInfo(ProjectUpdateInfoDTO project) {
        log.trace("开始修改...");
        //从参数中获取id
        Long id = project.getId();
        log.debug("要修改项目的id:{}",id);
        //通过id查询数据库中游乐项目数据
        ProjectSimpleVO resultById = mapper.getProjectById(id);
        log.debug("通过id获取数据库的数据:{}",resultById);
        //判断游乐项目是否存在
        //否:抛出异常
        if (resultById == null) {
            log.trace("修改失败,该项目不存在!");
            throw new ServiceException(State.ERR_PROJECT_NOT_FOUND,"修改失败,该项目不存在,!");
        }
        //是的话,再判断其名字是否重复
        // 获取参数中项目名字
        String name = project.getName();
        //通过名字查询数据库中游乐项目数据
        ProjectSimpleVO resultByName = mapper.getProjectByName(name);
        log.debug("通过名字获取数据:{}",resultByName);
        //判断:名字是否存在,并且判断参数的id是否与数据库中的一致
        //名字存在并id不一致将抛异常
        if(resultByName != null && !id.equals(resultByName.getId())){
            log.debug("修改名字为({})失败,名字重复!",name);
            throw new ServiceException(State.ERR_PROJECT_NAME_DUPLICATE,"修改失败,名字重复!");
        }
        //修改时间
        mapper.updateProjectGmtModified(id,LocalDateTime.now());
        //修改项目数据
        int rows = mapper.updateProjectInfo(project);
        if(rows != 1){
            throw new ServiceException(State.ERR_UPDATE,"修改失败,服务器正忙!");
        }
        log.debug("修改id({})的数据完成!",id);

    }

    @Override
    public ProjectSimpleVO getProjectSimpleByName(String name) {
        log.trace("开始查询单个项目数据...");
        //通过名字查询项目的数据
        ProjectSimpleVO project = mapper.getProjectByName(name);
        if (project == null) {
            log.trace("查询失败,该游乐项目不存在!");
            throw new ServiceException(State.ERR_PROJECT_NOT_FOUND,"查询失败,该游乐项目不存在!");
        }
        log.debug("根据项目的名字查询到信息:{}",project);
        return project;
    }

    @Override
    public List<ProjectSimpleVO> projectList() {
        return mapper.listProject();
    }
}
